<?php

namespace app\worker\controller;

use GatewayWorker\Lib\Gateway;
include_once dirname(__FILE__).'/../../service/Token.php';

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    /**
     * 新建一个类的静态成员，用来保存数据库实例
     */
    public static $db = null;

    /**
     * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次。
     * 可以在这里为每一个businessWorker进程做一些全局初始化工作，例如设置定时器，初始化redis连接，数据库连接等等。
     * 注意：$businessworker->onWorkerStart和Event::onWorkerStart不会互相覆盖，如果两个回调都设置则都会运行。
     * @param $worker
     */
    public static function onWorkerStart($worker)
    {

    }

    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect     *
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        // 向当前client_id发送数据
        //Gateway::sendToClient($client_id, sprintf('Hello %s',$client_id));
        // 向所有人发送
        //Gateway::sendToAll(sprintf('用户 %s 已登录！',$client_id));
    }

    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public function onMessage($client_id, $message)
    {
        // 向所有人发送
        // Gateway::sendToAll(sprintf('用户 %s 说：%s',$client_id,$message));

        // 绑定
        // Gateway::sendToAll(sprintf($message));
        $message = json_decode($message, true);



        if (isset($message['type']) && $message['type'] == 'ping') {
            //心跳
            return Gateway::sendToClient($client_id, json_encode([
                'type' => 'pong'
            ]));
        }

        if (isset($message['type']) && $message['type'] == 'lianmai' && $message['orderid']) {
            $app = $message['app'] ?? 'zaima';
            $redis = new \Redis();
            $redis->connect('127.0.0.1',6379);
            if(getenv('REDIS_PASS')){
                $redis->auth(getenv('REDIS_PASS'));
            }
            $second = 30;
            // $message['version'] = 2;
            if (isset($message['version'])) {
                if ($message['version'] == 2) {
                    $second = 8;
                }
            }
            // $redis->set($app.':lianmaiuserxq:' . $message['userid'].':'.$message['orderid'],$message['orderid'],3);
            // $redis->set($app.':lianmaiuserdq:' . $message['userid'].':'.$message['orderid'],$message['orderid'],$second);
            $redis->set($app.':lianmaiuserlast:'.$message['orderid'].':'.$message['userid'],time(),120);
            return $redis->set($app.':lianmaiuser:' . $message['userid'],$message['orderid'],$second);
        }

        if (isset($message['token'])) {
            $checkToken = \app\service\Token::checkToken($message['token'], 0);
            $user_id = 0;
            if ($checkToken) {
                $data = (array)$checkToken['data']['data'];
                $user_id = $data['userid'];
            }
            if ($user_id) {
                if ($message['type'] == 'refreshstate') {
                    $redis = new \Redis();
                    $redis->connect('127.0.0.1',6379);
                    if(getenv('REDIS_PASS')){
                        $redis->auth(getenv('REDIS_PASS'));
                    }
                    $second = 10;
                    return $redis->set('zaima:refreshstate:' . $user_id,1,$second);
                } else if ($type == 'binduid') {
                    Gateway::bindUid($client_id, $message['env'].$user_id);
                }
            }
        }

        if (!in_array($client_id, Gateway::getClientIdByUid($message['userid']))) {
            Gateway::bindUid($client_id, $message['userid']);
            // Gateway::sendToAll(sprintf('用户 %s 说：%s',$client_id,'绑定成功'));
        }

        if (isset($message['touserid'])) {
            if (!in_array($client_id, Gateway::getClientIdByUid($message['touserid']))) {
                Gateway::bindUid($client_id, $message['touserid']);
                // Gateway::sendToAll(sprintf('用户 %s 说：%s',$client_id,'绑定成功'));
            }
        }
    }

    /**
     * 当用户断开连接时触发
     * @param int $client_id 连接id
     */
    public static function onClose($client_id)
    {
        // 向所有人发送
        //GateWay::sendToAll(sprintf('用户 %s 已退出！',$client_id));
    }

}